tkinter 您所在的位置:网站首页 python tkinter ttk的使用上 tkinter

tkinter

2024-04-30 07:06| 来源: 网络整理| 查看: 265

目录 1 tkinter — Tcl/Tk 的 Python 接口 1.1 建筑学 1.2 Tkinter 模块 1.3 Tkinter 生命保护器 1.3.1 你好世界计划 1.3.2 重要的传统知识概念 1.3.3 了解 Tkinter 如何包装 Tcl/Tk 1.3.4 我如何能…? 什么选择……? 1.3.5 浏览 Tcl/Tk 参考手册 1.4 线程模型 1.5 方便参考 1.5.1 设置选项 1.5.2 包装工 1.5.3 封隔器选项 1.5.4 耦合小部件变量 1.5.5 窗口管理器 1.5.6 Tk 选项数据类型 1.5.7 绑定和事件 1.5.8 索引参数 1.5.9 图片 1.6 文件处理程序 tkinter — Tcl/Tk 的 Python 接口

源代码: :source:`Lib/tkinter/__init__.py`

tkinter 包(“Tk 接口”)是 Tcl/Tk GUI 工具包的标准 Python 接口。 Tk 和 tkinter 在大多数 Unix 平台(包括 macOS)以及 Windows 系统上都可用。

从命令行运行 python -m tkinter 应该会打开一个窗口,演示一个简单的 Tk 界面,让您知道 tkinter 已正确安装在您的系统上,并显示安装了哪个版本的 Tcl/Tk ,因此您可以阅读特定于该版本的 Tcl/Tk 文档。

Tkinter 支持一系列 Tcl/Tk 版本,构建时有或没有线程支持。 官方 Python 二进制版本捆绑了 Tcl/Tk 8.6 线程。 有关受支持版本的更多信息,请参阅 _tkinter 模块的源代码。

Tkinter 不是一个简单的包装器,而是添加了大量自己的逻辑来使体验更加 Pythonic。 本文档将重点介绍这些添加和更改,并参考官方 Tcl/Tk 文档以了解未更改的详细信息。

笔记

Tcl/Tk 8.5 (2007) 引入了一组现代主题用户界面组件以及使用它们的新 API。 新旧 API 仍然可用。 您可以在网上找到的大多数文档仍然使用旧的 API,并且可能已经过时了。

也可以看看

*; 文档 关于使用 Tkinter 创建用户界面的广泛教程。 解释关键概念,并说明使用现代 API 的推荐方法。 *; Tkinter 8.5 参考:Python 的 GUI Tkinter 8.5 的参考文档详细说明了可用的类、方法和选项。

Tcl/Tk 资源:

*; Tk 命令 对 Tkinter 使用的每个底层 Tcl/Tk 命令的综合参考。 *; Tcl/Tk 主页 附加文档以及指向 Tcl/Tk 核心开发的链接。

图书:

*; 忙碌的 Python 开发人员的现代 Tkinter 通过马克罗斯曼。 (ISBN 978-1999149567) *; Python 和 Tkinter 编程 通过艾伦摩尔。 (ISBN 978-1788835886) *; 编程 Python 作者:马克·卢茨; 对 Tkinter 有很好的覆盖。 (ISBN 978-0596158101) *; Tcl 和 Tk 工具包(第二版) 作者:Tcl/Tk 的发明者 John Ousterhout 和 Ken Jones; 不包括 Tkinter。 (ISBN 978-0321336330)

建筑学

Tcl/Tk 不是一个单一的库,而是由几个不同的模块组成,每个模块都有独立的功能和自己的官方文档。 Python 的二进制版本还随附了一个附加模块。

TCL Tcl 是一种动态解释型编程语言,就像 Python 一样。 尽管它可以单独用作通用编程语言,但它最常作为脚本引擎或 Tk 工具包的接口嵌入到 C 应用程序中。 Tcl 库有一个 C 接口来创建和管理 Tcl 解释器的一个或多个实例,在这些实例中运行 Tcl 命令和脚本,并添加在 Tcl 或 C 中实现的自定义命令。 每个解释器都有一个事件队列,并且有一些工具可以向它发送事件并处理它们。 与 Python 不同,Tcl 的执行模型是围绕协作多任务设计的,Tkinter 弥合了这种差异(详见 线程模型 )。 TK Tk 是一个用 C 实现的 Tcl 包 ,它添加了自定义命令来创建和操作 GUI 小部件。 每个 Tk 对象都嵌入了自己的 Tcl 解释器实例,并将 Tk 加载到其中。 Tk 的小部件非常可定制,但代价是外观过时。 Tk 使用 Tcl 的事件队列来生成和处理 GUI 事件。 塔克 Themed Tk (Ttk) 是一个更新的 Tk 小部件系列,与许多经典 Tk 小部件相比,它在不同平台上提供了更好的外观。 从 Tk 8.5 版开始,Ttk 作为 Tk 的一部分分发。 Python 绑定在单独的模块 tkinter.ttk 中提供。

在内部,Tk 和 Ttk 使用底层操作系统的工具,即 Unix/X11 上的 Xlib,macOS 上的 Cocoa,Windows 上的 GDI。

当你的 Python 应用程序使用 Tkinter 中的一个类时,例如,创建一个小部件,tkinter 模块首先组装一个 Tcl/Tk 命令字符串。 它将 Tcl 命令字符串传递给内部 _tkinter 二进制模块,然后调用 Tcl 解释器对其进行评估。 然后 Tcl 解释器将调用 Tk 和/或 Ttk 包,这些包将依次调用 Xlib、Cocoa 或 GDI。

Tkinter 模块

对 Tkinter 的支持分布在多个模块中。 大多数应用程序将需要主 tkinter 模块,以及 tkinter.ttk 模块,该模块提供现代主题小部件集和 API:

from tkinter import * from tkinter import ttk class tkinter.Tk(screenName=None, baseName=None, className='Tk', useTk=1) Tk 类是在没有参数的情况下实例化的。 这将创建 Tk 的顶级小部件,它通常是应用程序的主窗口。 每个实例都有自己关联的 Tcl 解释器。 tkinter.Tcl(screenName=None, baseName=None, className='Tk', useTk=0) Tcl() 函数是一个工厂函数,它创建的对象与 Tk 类创建的对象非常相似,只是它不初始化 Tk 子系统。 在不想创建无关的顶层窗口或不能创建的环境(例如没有 X 服务器的 Unix/Linux 系统)中驱动 Tcl 解释器时,这通常很有用。 由 Tcl() 对象创建的对象可以通过调用其 loadtk() 方法来创建顶层窗口(并初始化 Tk 子系统)。

提供 Tk 支持的模块包括:

tkinter 主 Tkinter 模块。 tkinter.colorchooser 让用户选择颜色的对话框。 tkinter.commondialog 此处列出的其他模块中定义的对话框的基类。 tkinter.filedialog 允许用户指定要打开或保存的文件的通用对话框。 tkinter.font 帮助处理字体的实用程序。 tkinter.messagebox 访问标准 Tk 对话框。 tkinter.scrolledtext 内置垂直滚动条的文本小部件。 tkinter.simpledialog 基本对话框和便利功能。 tkinter.ttk Tk 8.5 中引入的主题小部件集,为主要 tkinter 模块中的许多经典小部件提供现代替代品。

附加模块:

_tkinter 一个二进制模块,包含 Tcl/Tk 的低级接口。 它由主 tkinter 模块自动导入,不应由应用程序员直接使用。 它通常是一个共享库(或 DLL),但在某些情况下可能与 Python 解释器静态链接。 idlelib Python 的集成开发和学习环境 (IDLE)。 基于 tkinter。 tkinter.constants 将各种参数传递给 Tkinter 调用时,可以用来代替字符串的符号常量。 由主 tkinter 模块自动导入。 tkinter.dnd (实验性)对 tkinter 的拖放支持。 当它被 Tk DND 取代时,它将被弃用。 tkinter.tix (不推荐使用)一个旧的第三方 Tcl/Tk 包,它添加了几个新的小部件。 在 tkinter.ttk 中可以找到大多数更好的替代方案。 turtle Tk 窗口中的海龟图形。

Tkinter 生命保护器

本节并非设计为关于 Tk 或 Tkinter 的详尽教程。 为此,请参阅前面提到的外部资源之一。 相反,本节非常快速地介绍了 Tkinter 应用程序的外观,确定了基本的 Tk 概念,并解释了 Tkinter 包装器的结构。

本节的其余部分将帮助您确定 Tkinter 应用程序中需要的类、方法和选项,以及在哪里可以找到关于它们的更详细文档,包括在官方 Tcl/Tk 参考手册中。

你好世界计划

我们将从介绍 Tkinter 中的“Hello World”应用程序开始。 这不是我们能写的最小的一个,但足以说明你需要知道的一些关键概念。

from tkinter import * from tkinter import ttk root = Tk() frm = ttk.Frame(root, padding=10) frm.grid() ttk.Label(frm, text="Hello World!").grid(column=0, row=0) ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0) root.mainloop()

导入后,下一行创建 Tk 类的实例,该类初始化 Tk 并创建其关联的 Tcl 解释器。 它还创建一个顶级窗口,称为根窗口,用作应用程序的主窗口。

以下行创建了一个框架小部件,在本例中,它将包含我们接下来将创建的标签和按钮。 该框架适合在根窗口内。

下一行创建一个包含静态文本字符串的标签小部件。 grid() 方法用于指定标签在其包含框架小部件中的相对布局(位置),类似于 HTML 中的表格的工作方式。

然后创建一个按钮小部件,并将其放置在标签的右侧。 当按下时,它将调用根窗口的 destroy() 方法。

最后,mainloop() 方法将所有内容都放在显示器上,并响应用户输入,直到程序终止。

重要的传统知识概念

即使是这个简单的程序也说明了以下关键的 Tk 概念:

小部件 Tkinter 用户界面由单独的 小部件 组成。 每个小部件都表示为一个 Python 对象,从 ttk.Frame、ttk.Label 和 ttk.Button 等类实例化。 小部件层次结构 小部件按 层次结构 排列。 标签和按钮包含在框架中,而框架又包含在根窗口中。 创建每个 child 小部件时,其 parent 小部件作为第一个参数传递给小部件构造函数。 配置选项 小部件具有 配置选项 ,可修改其外观和行为,例如要在标签或按钮中显示的文本。 不同类别的小部件将具有不同的选项集。 几何管理 小部件在创建时不会自动添加到用户界面。 几何管理器 像 grid 控制它们在用户界面中的位置。 事件循环 Tkinter 对用户输入、程序中的更改做出反应,甚至仅在主动运行 事件循环 时才刷新显示。 如果您的程序没有运行事件循环,您的用户界面将不会更新。

了解 Tkinter 如何包装 Tcl/Tk

当您的应用程序使用 Tkinter 的类和方法时,Tkinter 在内部组装表示 Tcl/Tk 命令的字符串,并在附加到您的应用程序的 Tk 实例的 Tcl 解释器中执行这些命令。

无论是尝试浏览参考文档、尝试找到正确的方法或选项、改编一些现有代码,还是调试您的 Tkinter 应用程序,有时了解这些底层 Tcl/Tk 命令的外观会很有用。

为了说明,这里是上面 Tkinter 脚本主要部分的 Tcl/Tk 等效项。

ttk::frame .frm -padding 10 grid .frm grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0 grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0

Tcl 的语法类似于许多 shell 语言,其中第一个单词是要执行的命令,后面是该命令的参数,用空格分隔。 在不涉及太多细节的情况下,请注意以下几点:

用于创建小部件的命令(如 ttk::frame)对应于 Tkinter 中的小部件类。 Tcl 小部件选项(如 -text)对应于 Tkinter 中的关键字参数。 小部件由 Tcl 中的 路径名 引用(如 .frm.btn),而 Tkinter 不使用名称而是使用对象引用。 小部件在小部件层次结构中的位置在其(分层)路径名中进行编码,该路径名使用 .(点)作为路径分隔符。 根窗口的路径名就是 .(点)。 在 Tkinter 中,层次结构不是由路径名定义的,而是通过在创建每个子小部件时指定父小部件来定义的。 在 Tcl 中作为单独的 commands 实现的操作(如 grid 或 destroy)在 Tkinter 小部件对象上表示为 methods。 正如您将很快看到的,在其他时候,Tcl 使用看似是对小部件对象的方法调用,这更接近于 Tkinter 中使用的内容。

我如何能…? 什么选择……?

如果您不确定如何在 Tkinter 中执行某些操作,并且无法立即在您正在使用的教程或参考文档中找到它,那么有一些策略可能会有所帮助。

首先,请记住,各个小部件如何工作的细节可能因 Tkinter 和 Tcl/Tk 的不同版本而异。 如果您正在搜索文档,请确保它对应于您系统上安装的 Python 和 Tcl/Tk 版本。

在搜索如何使用 API 时,知道您正在使用的类、选项或方法的确切名称会很有帮助。 自省,无论是在交互式 Python shell 中还是使用 print(),都可以帮助您确定您需要什么。

要找出任何小部件上可用的配置选项,请调用其 configure() 方法,该方法返回一个字典,其中包含有关每个对象的各种信息,包括其默认值和当前值。 使用 keys() 仅获取每个选项的名称。

btn = ttk.Button(frm, ...) print(btn.configure().keys())

由于大多数小部件都有许多共同的配置选项,因此找出特定于特定小部件类的特定选项会很有用。 将选项列表与更简单的小部件(如框架)的列表进行比较是一种方法。

print(set(btn.configure().keys()) - set(frm.configure().keys()))

同样,您可以使用标准的 dir() 函数找到小部件对象的可用方法。 如果您尝试一下,您会看到有超过 200 种常见的小部件方法,因此再次识别特定于小部件类的方法会很有帮助。

print(dir(btn)) print(set(dir(btn)) - set(dir(frm))) 浏览 Tcl/Tk 参考手册

如前所述,官方的 Tk 命令 参考手册(手册页)通常是对小部件特定操作的最准确描述。 即使您知道所需的选项或方法的名称,您仍然可能有几个地方可以查看。

虽然 Tkinter 中的所有操作都是作为对小部件对象的方法调用来实现的,但您已经看到许多 Tcl/Tk 操作显示为将小部件路径名作为其第一个参数,后跟可选参数的命令,例如

destroy . grid .frm.btn -column 0 -row 0

然而,其他的看起来更像是在小部件对象上调用的方法(实际上,当您在 Tcl/Tk 中创建小部件时,它会创建一个带有小部件路径名的 Tcl 命令,该命令的第一个参数是名称调用的方法)。

.frm.btn invoke .frm.lbl configure -text "Goodbye"

在官方 Tcl/Tk 参考文档中,您会在特定小部件的手册页上找到大多数看起来像方法调用的操作(例如,您会在 ttk 上找到 invoke() 方法: :button 手册页),而将小部件作为参数的函数通常有自己的手册页(例如,grid)。

您可以在 options 或 ttk::widget 手册页中找到许多常用选项和方法,而其他一些则在特定小部件类的手册页中找到。

您还会发现许多 Tkinter 方法都有复合名称,例如 winfo_x()、winfo_height()、winfo_viewable()。 您可以在 winfo 手册页中找到所有这些的文档。

笔记

有点令人困惑的是,所有 Tkinter 小部件上也有方法实际上并不在小部件上运行,而是在全局范围内运行,独立于任何小部件。 示例是访问剪贴板或系统响铃的方法。 (它们恰好作为所有 Tkinter 小部件继承自的基本 Widget 类中的方法实现)。

线程模型

Python 和 Tcl/Tk 有非常不同的线程模型,tkinter 试图桥接。 如果您使用线程,则可能需要注意这一点。

Python 解释器可能有许多与之关联的线程。 在 Tcl 中,可以创建多个线程,但每个线程都有一个单独的 Tcl 解释器实例与之关联。 线程也可以创建多个解释器实例,尽管每个解释器实例只能由创建它的一个线程使用。

tkinter 创建的每个 Tk 对象都包含一个 Tcl 解释器。 它还跟踪哪个线程创建了该解释器。 可以从任何 Python 线程调用 tkinter。 在内部,如果调用来自除创建 Tk 对象的线程之外的线程,则会将事件发布到解释器的事件队列,并在执行时将结果返回给调用 Python 线程。

Tcl/Tk 应用程序通常是事件驱动的,这意味着在初始化之后,解释器运行一个事件循环(即 Tk.mainloop()) 并响应事件。 因为是单线程的,事件处理程序必须快速响应,否则会阻塞其他事件的处理。 为了避免这种情况,任何长时间运行的计算都不应该在事件处理程序中运行,而是使用计时器分解成更小的部分,或者在另一个线程中运行。 这与许多 GUI 工具包不同,在这些工具包中,GUI 在与所有应用程序代码(包括事件处理程序)完全独立的线程中运行。

如果 Tcl 解释器没有运行事件循环和处理事件,则从运行 Tcl 解释器的线程以外的线程发出的任何 tkinter 调用都将失败。

存在一些特殊情况:

可以构建 Tcl/Tk 库,因此它们不是线程感知的。 在这种情况下,tkinter 从原始 Python 线程调用库,即使这与创建 Tcl 解释器的线程不同。 全局锁确保一次只发生一个调用。 虽然 tkinter 允许你创建一个以上的 Tk 对象的实例(使用它自己的解释器),但属于同一线程的所有解释器共享一个公共事件队列,它得到丑的快。 在实践中,一次不要创建一个以上的 Tk 实例。 否则,最好在单独的线程中创建它们并确保您正在运行线程感知 Tcl/Tk 构建。 阻塞事件处理程序并不是阻止 Tcl 解释器重新进入事件循环的唯一方法。 甚至可以运行多个嵌套的事件循环或完全放弃事件循环。 如果您在处理事件或线程方面有任何棘手的事情,请注意这些可能性。 有一些选择 tkinter 函数目前仅在从创建 Tcl 解释器的线程调用时才起作用。

方便参考

设置选项

选项控制小部件的颜色和边框宽度等内容。 可以通过三种方式设置选项:

在对象创建时,使用关键字参数 fred = Button(self, fg="red", bg="blue") 创建对象后,将选项名称视为字典索引 fred["fg"] = "red" fred["bg"] = "blue" 使用 config() 方法在创建对象后更新多个属性 fred.config(fg="red", bg="blue")

有关给定选项及其行为的完整说明,请参阅相关小部件的 Tk 手册页。

请注意,手册页列出了每个小部件的“标准选项”和“小部件特定选项”。 前者是许多小部件共有的选项列表,后者是该特定小部件特有的选项。 标准选项记录在 options(3) 手册页上。

本文档中不区分标准选项和特定于小部件的选项。 某些选项不适用于某些类型的小部件。 给定的小部件是否响应特定选项取决于小部件的类别; 按钮有 command 选项,标签没有。

给定小部件支持的选项列在该小部件的手册页中,或者可以在运行时通过调用不带参数的 config() 方法或调用该小部件上的 keys() 方法来查询。 这些调用的返回值是一个字典,其键是字符串形式的选项名称(例如,'relief'),其值为 5 元组。

一些选项,如 bg 是具有长名称的常用选项的同义词(bg 是“背景”的简写)。 将 config() 方法传递给速记选项的名称将返回一个 2 元组,而不是 5 元组。 传回的 2 元组将包含同义词的名称和“真实”选项(例如 ('bg', 'background'))。

指数 意义 例子 0 选项名称 'relief' 1 数据库查找的选项名称 'relief' 2 用于数据库查找的选项类 'Relief' 3 默认值 'raised' 4 当前值 'groove'

例子:

>>> print(fred.config()) {'relief': ('relief', 'relief', 'Relief', 'raised', 'groove')}

当然,打印的字典将包括所有可用选项及其值。 这仅作为示例。

包装工

封隔器是 Tk 的几何管理机制之一。 几何管理器用于指定小部件在其容器内的相对定位 - 它们的相互 master。 相对于比较笨重的placer(使用较少,这里不做介绍),packer采取定性关系规范——above,to the left of 、 填充 等 - 并努力为您确定确切的放置坐标。

任何 master 小部件的大小由内部“从属小部件”的大小决定。 打包器用于控制从属部件在它们被打包到的主部件中出现的位置。 您可以将小部件打包到框架中,并将框架打包到其他框架中,以实现您想要的那种布局。 此外,一旦打包,该安排会动态调整以适应配置的增量更改。

请注意,在使用几何管理器指定几何之前,小部件不会出现。 忽略几何规范是一个常见的早期错误,然后当小部件被创建但什么也没出现时会感到惊讶。 小部件只有在它应用了例如打包程序的 pack() 方法后才会出现。

可以使用关键字-选项/值对调用 pack() 方法,这些对控制小部件在其容器中的显示位置,以及在调整主应用程序窗口大小时的行为方式。 这里有些例子:

fred.pack() # defaults to side = "top" fred.pack(side="left") fred.pack(expand=1) 封隔器选项

有关加壳程序及其可以采用的选项的更多信息,请参阅手册页和 John Ousterhout 的书的第 183 页。

锚 锚型。 表示包装工将每个奴隶放置在其包裹中的位置。 扩张 布尔值,0 或 1。 填 合法值:'x'、'y'、'both'、'none'。 ipadx 和 ipady 距离 - 在从属部件的每一侧指定内部填充。 padx 和 pady 距离 - 在从属部件的每一侧指定外部填充。 边 合法值为:'left'、'right'、'top'、'bottom'。

耦合小部件变量

某些小部件(如文本输入小部件)的当前值设置可以通过使用特殊选项直接连接到应用程序变量。 这些选项是 variable、textvariable、onvalue、offvalue 和 value。 这种连接是双向的:如果变量因任何原因发生变化,它所连接的小部件将更新以反映新值。

不幸的是,在 tkinter 的当前实现中,不可能通过 variable 或 textvariable 选项将任意 Python 变量移交给小部件。 唯一可以使用的变量类型是从名为 Variable 的类派生的变量,该类在 tkinter 中定义。

已经定义了许多有用的 Variable 子类:StringVar、IntVar、DoubleVar 和 BooleanVar。 要读取此类变量的当前值,请对其调用 get() 方法,并调用 set() 方法更改其值。 如果您遵循此协议,小部件将始终跟踪变量的值,而无需您进一步干预。

例如:

import tkinter as tk class App(tk.Frame): def __init__(self, master): super().__init__(master) self.pack() self.entrythingy = tk.Entry() self.entrythingy.pack() # Create the application variable. self.contents = tk.StringVar() # Set it to some value. self.contents.set("this is a variable") # Tell the entry widget to watch this variable. self.entrythingy["textvariable"] = self.contents # Define a callback for when the user hits return. # It prints the current value of the variable. self.entrythingy.bind('', self.print_contents) def print_contents(self, event): print("Hi. The current entry content is:", self.contents.get()) root = tk.Tk() myapp = App(root) myapp.mainloop() 窗口管理器

在 Tk 中,有一个实用命令 wm,用于与窗口管理器交互。 wm 命令的选项允许您控制标题、位置、图标位图等内容。 在 tkinter 中,这些命令已作为 Wm 类上的方法实现。 顶级小部件是 Wm 类的子类,因此可以直接调用 Wm 方法。

要获得包含给定小部件的顶级窗口,您通常可以仅参考小部件的主窗口。 当然,如果小部件已打包在框架内,则主窗口将不会代表顶级窗口。 要获得包含任意小部件的顶级窗口,您可以调用 _root() 方法。 此方法以下划线开头,表示此函数是实现的一部分,而不是 Tk 功能的接口。

以下是一些典型用法的示例:

import tkinter as tk class App(tk.Frame): def __init__(self, master=None): super().__init__(master) self.pack() # create the application myapp = App() # # here are method calls to the window manager class # myapp.master.title("My Do-Nothing Application") myapp.master.maxsize(1000, 400) # start the program myapp.mainloop() Tk 选项数据类型 锚

合法值是罗盘的点数:"n"、"ne"、"e"、"se"、"s"、"sw"、 "w"、"nw" 以及 "center"。

位图

有八个内置的命名位图:'error'、'gray25'、'gray50'、'hourglass'、'info'、'questhead' ]、'question'、'warning'。 要指定 X 位图文件名,请提供文件的完整路径,并以 @ 开头,如 "@/usr/contrib/bitmap/gumby.bit"。

布尔值

您可以传递整数 0 或 1 或字符串 "yes" 或 "no"。

打回来

这是任何不带参数的 Python 函数。 例如:

def print_it(): print("hi there") fred["command"] = print_it 颜色

颜色可以是 rgb.txt 文件中 X 颜色的名称,也可以是表示 4 位 RGB 值的字符串:"#RGB",8 位:"#RRGGBB",12 位”"#RRRGGGBBB" 或 16 位 "#RRRRGGGGBBBB" 范围,其中 R、G、B 表示任何合法的十六进制数字。 有关详细信息,请参阅 Ousterhout 书中的第 160 页。

光标

可以使用来自 cursorfont.h 的标准 X 光标名称,无需 XC_ 前缀。 例如,要获得手形光标 (XC_hand2),请使用字符串 "hand2"。 您还可以指定自己的位图和遮罩文件。 参见 Ousterhout 书中的第 179 页。

距离

屏幕距离可以以像素或绝对距离指定。 像素以数字形式给出,绝对距离以字符串形式给出,尾随字符表示单位:c 表示厘米,i 表示英寸,m 表示毫米,p ] 为打印机点数。 例如,3.5 英寸表示为 "3.5i"。

字体

Tk 使用列表字体名称格式,例如 {courier 10 bold}。 带有正数的字体大小以磅为单位; 带有负数的尺寸以像素为单位。

几何学

这是一个格式为 widthxheight 的字符串,其中大多数小部件的宽度和高度以像素为单位(显示文本的小部件以字符为单位)。 例如:fred["geometry"] = "200x100"。

证明合法

合法值为字符串:"left"、"center"、"right" 和 "fill"。

地区

这是一个包含四个以空格分隔的元素的字符串,每个元素都是一个合法的距离(见上文)。 例如:"2 3 4 5" 和 "3i 2i 4.5i 2i" 和 "3c 2c 4c 10.43c" 都是合法的区域。

宽慰

确定小部件的边框样式。 合法值为:"raised"、"sunken"、"flat"、"groove"和"ridge"。

滚动命令

这几乎总是某些滚动条小部件的 set() 方法,但可以是任何接受单个参数的小部件方法。

必须是以下之一:"none"、"char" 或 "word"。

绑定和事件

小部件命令中的 bind 方法允许您监视某些事件并在该事件类型发生时触发回调函数。 bind方法的形式为:

def bind(self, sequence, func, add=''):

在哪里:

序列 是一个字符串,表示事件的目标类型。 (有关详细信息,请参阅 John Ousterhout 的书的 bind 手册页和第 201 页)。 功能 是一个 Python 函数,带有一个参数,在事件发生时被调用。 Event 实例将作为参数传递。 (以这种方式部署的函数通常称为 callbacks。) 添加 是可选的,可以是 或 '+'。 传递空字符串表示此绑定将替换与此事件关联的任何其他绑定。 传递一个 '+' 意味着这个函数将被添加到绑定到这个事件类型的函数列表中。

例如:

def turn_red(self, event): event.widget["activeforeground"] = "red" self.button.bind("", self.turn_red)

请注意如何在 turn_red() 回调中访问事件的小部件字段。 此字段包含捕获 X 事件的小部件。 下表列出了您可以访问的其他事件字段,以及它们在 Tk 中的表示方式,这在参考 Tk 手册页时非常有用。

TK Tkinter 事件字段 TK Tkinter 事件字段 %f 重点 %一种 字符 %H 高度 %E 发送事件 %k 关键代码 %K 键符 %s 状态 %N keysym_num %t 时间 %T 类型 %w 宽度 %W 小部件 %x x %X x_root %y y %Y y_root

索引参数

许多小部件需要传递“索引”参数。 它们用于指向 Text 小部件中的特定位置,或 Entry 小部件中的特定字符,或 Menu 小部件中的特定菜单项。

条目小部件索引(索引、视图索引等) 条目小部件具有指代正在显示的文本中的字符位置的选项。 您可以使用这些 tkinter 函数来访问文本小部件中的这些特殊点: 文本小部件索引 Text 小部件的索引符号非常丰富,在 Tk 手册页中得到了最好的描述。 菜单索引(menu.invoke(), menu.entryconfig() 等) 菜单的一些选项和方法操作特定的菜单条目。 任何时候选项或参数需要菜单索引时,您都可以传入: 一个整数,它指的是小部件中条目的数字位置,从顶部开始计数,从 0 开始; 字符串"active",指的是当前光标所在的菜单位置; 字符串 "last" 指的是最后一个菜单项; 前面有 @ 的整数,如 @6,其中整数被解释为菜单坐标系中的 y 像素坐标; 字符串 "none",表示根本没有菜单条目,最常与 menu.activate() 一起使用以停用所有条目,最后, 从菜单顶部到底部扫描的与菜单条目标签匹配的文本字符串。 请注意,此索引类型是在所有其他类型之后考虑的,这意味着匹配标记为 last、active 或 none 的菜单项可能会被解释为上述文字,而不是.

图片

通过tkinter.Image对应的子类可以创建不同格式的图片:

BitmapImage 用于 XBM 格式的图像。 PhotoImage 适用于 PGM、PPM、GIF 和 PNG 格式的图像。 从 Tk 8.6 开始支持后者。

任一类型的图像都是通过 file 或 data 选项创建的(其他选项也可用)。

然后可以在某些小部件支持 image 选项的任何地方使用图像对象(例如 标签、按钮、菜单)。 在这些情况下,Tk 不会保留对图像的引用。 当最后一个 Python 对图像对象的引用被删除时,图像数据也被删除,并且 Tk 将在使用图像的任何地方显示一个空框。

也可以看看

Pillow 包增加了对 BMP、JPEG、TIFF 和 WebP 等格式的支持。

文件处理程序

Tk 允许您注册和取消注册一个回调函数,当文件描述符上的 I/O 可能时,它将从 Tk 主循环调用。 每个文件描述符只能注册一个处理程序。 示例代码:

import tkinter widget = tkinter.Tk() mask = tkinter.READABLE | tkinter.WRITABLE widget.tk.createfilehandler(file, mask, callback) ... widget.tk.deletefilehandler(file)

此功能在 Windows 上不可用。

由于您不知道有多少字节可供读取,您可能不想使用 BufferedIOBase 或 TextIOBase read() 或 readline () 方法,因为这些方法会坚持读取预定义的字节数。 对于套接字,recv() 或 recvfrom() 方法可以正常工作; 对于其他文件,使用原始读取或 os.read(file.fileno(), maxbytecount)。

Widget.tk.createfilehandler(file, mask, func)

注册文件处理回调函数 func。 file 参数可以是具有 fileno() 方法的对象(例如文件或套接字对象),也可以是整数文件描述符。 mask 参数是以下三个常量中任何一个的 ORed 组合。 回调调用如下:

callback(file, mask) Widget.tk.deletefilehandler(file) 取消注册文件处理程序。 tkinter.READABLE

tkinter.WRITABLE tkinter.EXCEPTION

mask 参数中使用的常量。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有